package com.kavian.probability;

/**
 * 概率计算工具类
 * 
 * @author kavian
 * 
 */
public class ProbabilityUtil {

	/**
	 * 排列<br />
	 * 从n个不同元素中取出m(m<= n)个元素的所有排列个数<br />
	 * A = n!/(n-m)!
	 * 
	 * @param n
	 *            n个不同元素
	 * @param m
	 *            取出m个
	 * @return
	 */
	public static double arrangement(final double n, final double m) {
		double total = 1;
		// 分子计算
//		int molecule = 1;
//		for (int i = 0; i < n; i++) {
//			molecule = molecule * (i + 1);
//		}
//
//		// 分母计算
//		int denominator = 1;
//		for (int i = 0, len = (n - m); i < len; i++) {
//			denominator = denominator * (i + 1);
//		}
//
//		total = molecule / denominator;
		
		for (int i = 0; i < m; i++) {
			total = total * (n-i);
		}
		return total;
	}
	
	
	/**
	 * 组合<br />
	 * 从n个不同元素中取出m(m<= n)个元素的所有组合个数<br />
	 * @param n
	 * @param m
	 */
	public static double combination(final double n,final double m){
		if(m == 0){
			return 0;
		}
		double total = arrangement(n,m)/arrangement(m,m);
		return total;
	}
}